package com.sunriz.refreshhcdata.utils;

/**
 * ClassName: NumericalConversion
 * Package: com.sunriz.refreshhcdata.utils
 * Description:
 *
 * @Author BuTang
 * @Create 2024/11/13 14:57
 * @Version 1.0
 */

public class NumericalConversion {
    public static String sendConversion(long value, int byteSize ,boolean isNeedSignConversion ,double dataPrecision){
        String ans = "";
        if (!isNeedSignConversion){
            // 不需要正负转换，直接赋值返回。保留两位小数
            ans = String.format("%.2f", value * dataPrecision);
            return ans;
        }else {

            if (byteSize == 1) {
                // 16进制，保留两位小数
                ans = String.format("%.2f", (short) value * dataPrecision);
            } else {
                // 32进制，保留两位小数
                int signedValue = (value > Integer.MAX_VALUE)
                        ? (int) (value - (long) Integer.MAX_VALUE - 1)
                        : (int) value;
                ans = String.format("%.2f", signedValue * dataPrecision);
            }
            return ans ;
        }
    }

    // 反向转换方法
    public static long reverseConversion(String formattedValue, int byteSize, boolean isNeedSignConversion, double dataPrecision) {
        // 将字符串转换为double类型
        double value = Double.parseDouble(formattedValue);

        // 如果需要进行反向的正负转换
        if (isNeedSignConversion) {
            if (byteSize == 1) {
                // 16进制反向转换
                // 由于是short类型的，恢复时可以做类似反向运算
                value = value / dataPrecision; // 恢复原值
                return (long) value; // 返回long类型结果
            } else {
                // 32进制反向转换
                value = value / dataPrecision; // 恢复原值
                long restoredValue = (long) value;

                // 判断是否是负数并进行恢复
                if (restoredValue > Integer.MAX_VALUE) {
                    // 如果值大于 Integer.MAX_VALUE，则需要恢复为负数
                    return restoredValue + (long) Integer.MAX_VALUE + 1;
                }
                return restoredValue;
            }
        } else {
            // 不需要正负转换，直接返回恢复后的值
            value = value / dataPrecision; // 恢复原值
            return (long) value;
        }
    }
}
